home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / game / shoot / ADoomPPC_src.lha / ADoomPPC_src / dehacked.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-12  |  18.7 KB  |  730 lines

  1. // Emacs style mode select   -*- C++ -*-
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Cyril Deble 1998 (cyril.deble@inforoute.cgs.fr)
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // DESCRIPTION:
  18. //      Doom internal dehacked file loader for amiga only :)
  19. //      0.1 (11/02/98) First internal release
  20. //      0.2 (15/02/98) Currently only a few options supported
  21. //      0.3 (08/03/98) Added much more (almost all) options support
  22. //                     and corrected some pointless bugs
  23. //
  24. //-----------------------------------------------------------------------------
  25.  
  26. static const char
  27. rcsid[] = "$Id: dehacked.c,v 0.3 1998/03/08 23:05:00 b1 Exp $";
  28.  
  29. #include <ctype.h>
  30. #include <stdlib.h>
  31.  
  32. // Data.
  33. #include "doomdef.h"
  34. #include "sounds.h"
  35. #include "m_fixed.h"
  36. #include "doomstat.h"
  37. #include "info.h"
  38. #include "m_cheat.h"
  39.  
  40. #ifdef __GNUG__
  41. #pragma implementation "info.h"
  42. #endif
  43. #include "info.h"
  44.  
  45. #include "p_mobj.h"
  46.  
  47. /* for ammo */
  48. extern int clipammo[];
  49.  
  50. /* for misc */
  51. extern int idfa_armor;
  52. extern int idfa_armor_class;
  53. extern int idkfa_armor;
  54. extern int idkfa_armor_class;
  55. extern int god_health;
  56. extern int initial_health;
  57. extern int initial_bullets;
  58. extern int MAXHEALTH;
  59. extern int max_armor;
  60. extern int green_armor_class;
  61. extern int blue_armor_class;
  62. extern int maxsoul;
  63. extern int soul_health;
  64. extern int mega_health;
  65. extern int BFGCELLS;
  66.  
  67. /* for cheat */
  68. extern char cheat_mus_seq[];
  69. extern char cheat_choppers_seq[];
  70. extern char cheat_god_seq[];
  71. extern char cheat_ammo_seq[];
  72. extern char cheat_ammonokey_seq[];
  73. extern char cheat_noclip_seq[];
  74. extern char cheat_commercial_noclip_seq[];
  75. extern char cheat_powerup_seq[7][10];
  76. extern char cheat_clev_seq[];
  77. extern char cheat_mypos_seq[];
  78. extern char cheat_amap_seq[];
  79.  
  80. enum
  81. {
  82.   THING_ID = 0,
  83.   THING_HIT_POINTS,
  84.   THING_SPEED,
  85.   THING_WIDTH,
  86.   THING_HEIGHT,
  87.   THING_MISSILE_DAMAGE,
  88.   THING_REACTION_TIME,
  89.   THING_PAIN_CHANCE,
  90.   THING_MASS,
  91.   THING_BITS,
  92.   THING_ALERT_SOUND,
  93.   THING_ATTACK_SOUND,
  94.   THING_PAIN_SOUND,
  95.   THING_DEATH_SOUND,
  96.   THING_ACTION_SOUND,
  97.   THING_INITIAL_FRAME,
  98.   THING_FIRST_MOVING_FRAME,
  99.   THING_INJURY_FRAME,
  100.   THING_CLOSE_ATTACK_FRAME,
  101.   THING_FAR_ATTACK_FRAME,
  102.   THING_DEATH_FRAME,
  103.   THING_EXPLODING_FRAME,
  104.   THING_RESPAWN_FRAME,
  105.  
  106.   FRAME_SPRITE_NUMBER,
  107.   FRAME_SPRITE_SUBNUMBER,
  108.   FRAME_DURATION,
  109.   FRAME_NEXT_FRAME,
  110.   FRAME_UNKNOWN_1,
  111.   FRAME_UNKNOWN_2,
  112.  
  113.   SPRITE_OFFSET,
  114.  
  115.   AMMO_MAX_AMMO,
  116.   AMMO_PER_AMMO,
  117.  
  118.   WEAPON_AMMO_TYPE,
  119.   WEAPON_DESELECT_FRAME,
  120.   WEAPON_SELECT_FRAME,
  121.   WEAPON_BOBBING_FRAME,
  122.   WEAPON_SHOOTING_FRAME,
  123.   WEAPON_FIRING_FRAME,
  124.  
  125.   POINTER_CODEP_FRAME,
  126.  
  127.   CHEAT_CHANGE_MUSIC,
  128.   CHEAT_CHAINSAW,
  129.   CHEAT_GOD_MODE,
  130.   CHEAT_AMMO_KEYS,
  131.   CHEAT_AMMO,
  132.   CHEAT_NO_CLIPPING_1,
  133.   CHEAT_NO_CLIPPING_2,
  134.   CHEAT_INVINCIBILITY,
  135.   CHEAT_BERSERK,
  136.   CHEAT_INVISIBILITY,
  137.   CHEAT_RADIATION_SUIT,
  138.   CHEAT_AUTO_MAP,
  139.   CHEAT_LITE_AMP_GOGGLES,
  140.   CHEAT_BEHOLD_MENU,
  141.   CHEAT_LEVEL_WARP,
  142.   CHEAT_PLAYER_POSITION,
  143.   CHEAT_MAP_CHEAT,
  144.  
  145.   MISC_INITIAL_HEALTH,
  146.   MISC_INITIAL_BULLETS,
  147.   MISC_MAX_HEALTH,
  148.   MISC_MAX_ARMOR,
  149.   MISC_GREEN_ARMOR_CLASS,
  150.   MISC_BLUE_ARMOR_CLASS,
  151.   MISC_MAX_SOULSPHERE,
  152.   MISC_SOULSPHERE_HEALTH,
  153.   MISC_MEGASPHERE_HEALTH,
  154.   MISC_GOD_MODE_HEALTH,
  155.   MISC_IDFA_ARMOR,
  156.   MISC_IDFA_ARMOR_CLASS,
  157.   MISC_IDKFA_ARMOR,
  158.   MISC_IDKFA_ARMOR_CLASS,
  159.   MISC_BFG_CELLS_SHOT,
  160.   MISC_MONSTERS_INFIGHT,
  161.  
  162.   NUM_KEYWORD
  163. };
  164.  
  165.  
  166. /* All keywords supported */
  167. char *Keywords[] = {
  168. /* Things */
  169. "id # = ",                  /* mobjinfo.doomednum    */
  170. "hit points = ",            /* mobjinfo.spawnhealth  */
  171. "speed = ",                 /* mobjinfo.speed        */
  172. "width = ",                 /* mobjinfo.radius       */
  173. "height = ",                /* mobjinfo.height       */
  174. "missile damage = ",        /* mobjinfo.damage       */
  175. "reaction time = ",         /* mobjinfo.reactiontime */
  176. "pain chance = ",           /* mobjinfo.painchance   */
  177. "mass = ",                  /* mobjinfo.mass         */
  178. "bits = ",                  /* mobjinfo.flags        */
  179. "alert sound = ",           /* mobjinfo.seesound     */
  180. "attack sound = ",          /* mobjinfo.attacksound  */
  181. "pain sound = ",            /* mobjinfo.painsound    */
  182. "death sound = ",           /* mobjinfo.deathsound   */
  183. "action sound = ",          /* mobjinfo.activesound  */
  184. "initial frame = ",         /* mobjinfo.spawnstate   */
  185. "first moving frame = ",    /* mobjinfo.seestate     */
  186. "injury frame = ",          /* mobjinfo.painstate    */
  187. "close attack frame = ",    /* mobjinfo.meleestate   */
  188. "far attack frame = ",      /* mobjinfo.missilestate */
  189. "death frame = ",           /* mobjinfo.deathstate   */
  190. "exploding frame = ",       /* mobjinfo.xdeathstate  */
  191. "respawn frame = ",         /* mobjinfo.raisestate   */
  192.  
  193. /* Frame */
  194.  
  195. "sprite number = ",         /* states.sprite    */
  196. "sprite subnumber = ",      /* states.frame     */
  197. "duration = ",              /* states.tics      */
  198. "next frame = ",            /* states.nextstate */
  199. "unknown 1 = ",             /* states.misc1     */
  200. "unknown 2 = ",             /* states.misc2     */
  201.  
  202. /* Sprite */
  203.  
  204. "offset =",                 /* supported */
  205.  
  206. /* Ammo */
  207.                            
  208. "max ammo = ",              /* maxammo  */
  209. "per ammo = ",              /* clipammo */
  210.  
  211. /* Weapon */
  212.  
  213. "ammo type = ",             /* weaponinfo.ammo       */
  214. "deselect frame = ",        /* weaponinfo.upstate    */
  215. "select frame = ",          /* weaponinfo.downstate  */
  216. "bobbing frame = ",         /* weaponinfo.readystate */
  217. "shooting frame = ",        /* weaponinfo.atkstate   */
  218. "firing frame = ",          /* weaponinfo.flashstate */
  219.  
  220. /* Pointer */
  221.  
  222. "codep frame = ",           /* supported */
  223.  
  224. /* Cheat */
  225.  
  226. "change music = ",          /* supported */
  227. "chainsaw = ",              /* supported */
  228. "god mode = ",              /* supported */
  229. "ammo & keys = ",           /* supported */
  230. "ammo = ",                  /* supported */
  231. "no clipping 1 = ",         /* supported */
  232. "no clipping 2 = ",         /* supported */
  233. "invincibility = ",         /* supported */
  234. "berserk = ",               /* supported */
  235. "invisibility = ",          /* supported */
  236. "radiation suit = ",        /* supported */
  237. "auto-map = ",              /* supported */
  238. "lite-amp goggles = ",      /* supported */
  239. "behold menu = ",           /* supported */
  240. "level warp = ",            /* supported */
  241. "player position = ",       /* supported */
  242. "map cheat = ",             /* supported */
  243.  
  244. /* Misc */
  245.  
  246. "initial health = ",        /* initial_health    */
  247. "initial bullets = ",       /* initial_bullets   */
  248. "max health = ",            /* maxhealth         */
  249. "max armor = ",             /* max_armor         */
  250. "green armor class = ",     /* green_armor_class */
  251. "blue armor class = ",      /* blue_armor_class  */
  252. "max soulsphere = ",        /* maxsoul           */
  253. "soulsphere health = ",     /* soul_health       */
  254. "megasphere health = ",     /* mega_health       */
  255. "god mode health = ",       /* god_health        */
  256. "idfa armor = ",            /* idfa_armor        */
  257. "idfa armor class = ",      /* idfa_armor_class  */
  258. "idkfa armor = ",           /* idkfa_armor       */
  259. "idkfa armor class = ",     /* idfa_armor_class  */
  260. "bfg cells/shot = ",        /* bfgcells          */
  261. "monsters infight = ",      /* not supported     */
  262.  
  263.  
  264. /* Others to follow :) */
  265. "\n"                     /* The last              */
  266. };
  267.  
  268.  
  269. /* Backup of action pointer */
  270. actionf_t actions[NUMSTATES];
  271. /* Backup of sprites names */
  272. char * oldsprnames[NUMSPRITES];
  273.  
  274. void DE_Cheat(char *cheatseq, char* newcheat)
  275. {
  276.   unsigned char *i,*j;
  277.  
  278.   for(i=newcheat;*i!='\0';i++)
  279.       *i=SCRAMBLE(*i);
  280.  
  281.   for(i=cheatseq,j=newcheat;*j!='\0' && *j!=0xff;i++,j++)
  282.       if(*i==1 || *i==0xff) // no more place in the cheat
  283.          return;
  284.       else
  285.          *i=*j;
  286.  
  287.   j=i;
  288.  
  289.   for(;*i!=0xff;i++)
  290.       if(*i==1)
  291.       {
  292.          *j++=1;
  293.          *j++=0;
  294.          *j++=0;
  295.          break;
  296.       }
  297.   *j=0xff;
  298.  
  299.   return;
  300. }
  301.  
  302.  
  303. void DE_Text(FILE* f,int len1,int len2)
  304. {
  305.   char s[50];
  306.   int i;
  307.  
  308.   // it is hard to change all the text in doom
  309.   // here i implement only vital things
  310.   // yes text change somes tables like music, sound and sprite name
  311.   if(len1>6)
  312.     return;
  313.  
  314.     if(fread(s,len1+len2,1,f))
  315.     {
  316.       for(i=0;i<108;i++)
  317.         if(!strncmp(S_sfx[i].name,s,len1))
  318.         {
  319.           strncpy(S_sfx[i].name,&(s[len1]),len2);
  320.           return;
  321.         }
  322.       for(i=0;i<NUMSPRITES;i++)
  323.         if(!strncmp(sprnames[i],s,len1))
  324.         {
  325.           strncpy(sprnames[i],&(s[len1]),len2);
  326.           return;
  327.         }
  328.       for(i=0;i<NUMSPRITES;i++)
  329.         if(!strncmp(sprnames[i],s,len1))
  330.         {
  331.           strncpy(sprnames[i],&(s[len1]),len2);
  332.           return;
  333.         }
  334.       for(i=1;i<68;i++)
  335.         if(!strncmp(S_music[i].name,s,len1))
  336.         {
  337.           strncpy(S_music[i].name,&(s[len1]),len2);
  338.           return;
  339.         }
  340.       /* more text to follow */
  341.  
  342.  
  343.     }
  344. }
  345.  
  346.  
  347. int
  348. DE_Search(char *arg, char **list)
  349. {
  350.   int i, l;
  351.  
  352.   /* Make into lower case, and get length of string */
  353.   for (l = 0; *(arg + l); l++)
  354.     *(arg + l) = tolower(*(arg + l));
  355.   /*printf("arg = '%s'\n", arg);*/
  356.  
  357.   for (i = 0; **(list + i) != '\n'; i++) {
  358.     /*printf("arg = '%s' list = '%s'\n", arg, *(list + i));*/
  359.     if (strstr(arg,*(list + i)))
  360.         return(i);
  361.   }
  362.   return(-1);
  363. }
  364.  
  365.  
  366. int
  367. DE_Hack( char * line)
  368. {
  369.     static int thing = 0;
  370.     static int frame = 0;
  371.     static int ammo = 0;
  372.     static int weapon = 0;
  373.     static int sprite = 0;
  374.     static int pointer = 0;
  375.  
  376.     int choice;
  377.     char * arg;
  378.  
  379.     /* scanf variables */
  380.     int n1;
  381.     char buf1[255];
  382.  
  383.     /* first check for main keywords */
  384.     if(sscanf(line, "Thing %d (%s)", &n1, buf1) == 2)
  385.     {
  386.          thing = n1-1;
  387.          //buf1[strlen(buf1)-1] = '\0';
  388.          //printf("-> Changing Thing %d (%s)\n", n1, buf1);
  389.          return(1);
  390.     }
  391.  
  392.     if(thing >= NUMMOBJTYPES) return(0);
  393.  
  394.     if(sscanf(line, "Frame %d", &n1) == 1)
  395.     {
  396.          frame = n1;
  397.          //printf("-> Changing Frame %d\n", n1);
  398.          return(1);
  399.     }
  400.  
  401.     if(frame >= NUMSTATES) return(0);
  402.  
  403.     if(sscanf(line, "Pointer %d", &n1) == 1)
  404.     {
  405.          pointer = n1;
  406.          //printf("-> Changing Pointer %d\n", n1);
  407.          return(1);
  408.     }
  409.  
  410.     if(pointer >= NUMSTATES) return(0);
  411.  
  412.     if(sscanf(line, "Ammo %d", &n1) == 1)
  413.     {
  414.          ammo = n1;
  415.          //printf("-> Changing Ammo %d\n", n1);
  416.          return(1);
  417.     }
  418.  
  419.     if(ammo >= NUMAMMO) return(0);
  420.  
  421.     if(sscanf(line, "Cheat %d", &n1) == 1)
  422.     {
  423.          //printf("-> Changing Cheat\n");
  424.          return(1);
  425.     }
  426.  
  427.     if(sscanf(line, "Weapon %d", &n1) == 1)
  428.     {
  429.          weapon = n1;
  430.          //printf("-> Changing Weapon %d\n", n1);
  431.          return(1);
  432.     }
  433.  
  434.     if(weapon >= NUMWEAPONS) return(0);
  435.  
  436.     if(sscanf(line, "Sprite %d", &n1) == 1)
  437.     {
  438.          sprite = n1;
  439.          //printf("-> Changing Sprite %d\n", n1);
  440.          return(1);
  441.     }
  442.  
  443.     if(sprite >= NUMSPRITES) return(0);
  444.  
  445.     if(sscanf(line, "Misc %d", &n1) == 1)
  446.     {
  447.          //printf("-> Changing Misc\n");
  448.          return(1);
  449.     }
  450.  
  451.     /* search for option */
  452.     choice = DE_Search(line, Keywords);
  453.  
  454. //    if(choice < 0 || choice > NUM_KEYWORD-1) return(0);
  455.         if((choice < 0) || (choice > NUM_KEYWORD-1))
  456.             return 0;
  457.  
  458.     arg = strstr(line, Keywords[choice]) +
  459.           strlen(Keywords[choice]);
  460.  
  461.     /*printf("Choice = %d, Arg = %s\n", choice, arg);*/
  462.  
  463.     switch(choice)
  464.     {
  465.       case THING_ID:
  466.           mobjinfo[thing].doomednum = atoi(arg);
  467.           break;
  468.       case THING_HIT_POINTS:
  469.           mobjinfo[thing].spawnhealth = atoi(arg);
  470.           break;
  471.       case THING_SPEED:
  472.           mobjinfo[thing].speed = atoi(arg);
  473.           break;
  474.       case THING_WIDTH:
  475.           mobjinfo[thing].radius = atoi(arg);
  476.           break;
  477.       case THING_HEIGHT:
  478.           mobjinfo[thing].height = atoi(arg);
  479.           break;
  480.       case THING_MISSILE_DAMAGE:
  481.           mobjinfo[thing].damage = atoi(arg);
  482.           break;
  483.       case THING_REACTION_TIME:
  484.           mobjinfo[thing].reactiontime = atoi(arg);
  485.           break;
  486.       case THING_PAIN_CHANCE:
  487.           mobjinfo[thing].painchance = atoi(arg);
  488.           break;
  489.       case THING_MASS:
  490.           mobjinfo[thing].mass = atoi(arg);
  491.           break;
  492.       case THING_BITS:
  493.           mobjinfo[thing].flags = atoi(arg);
  494.           break;
  495.       case THING_ALERT_SOUND:
  496.           mobjinfo[thing].seesound = atoi(arg);
  497.           break;
  498.       case THING_ATTACK_SOUND:
  499.           mobjinfo[thing].attacksound = atoi(arg);
  500.           break;
  501.       case THING_PAIN_SOUND:
  502.           mobjinfo[thing].painsound = atoi(arg);
  503.           break;
  504.       case THING_DEATH_SOUND:
  505.           mobjinfo[thing].deathsound = atoi(arg);
  506.           break;
  507.       case THING_ACTION_SOUND:
  508.           mobjinfo[thing].activesound = atoi(arg);
  509.           break;
  510.       case THING_INITIAL_FRAME:
  511.           mobjinfo[thing].spawnstate = atoi(arg);
  512.           break;
  513.       case THING_FIRST_MOVING_FRAME:
  514.           mobjinfo[thing].seestate = atoi(arg);
  515.           break;
  516.       case THING_INJURY_FRAME:
  517.           mobjinfo[thing].painstate = atoi(arg);
  518.           break;
  519.       case THING_CLOSE_ATTACK_FRAME:
  520.           mobjinfo[thing].meleestate = atoi(arg);
  521.           break;
  522.       case THING_FAR_ATTACK_FRAME:
  523.           mobjinfo[thing].missilestate = atoi(arg);
  524.           break;
  525.       case THING_DEATH_FRAME:
  526.           mobjinfo[thing].deathstate = atoi(arg);
  527.           break;
  528.       case THING_EXPLODING_FRAME:
  529.           mobjinfo[thing].xdeathstate = atoi(arg);
  530.           break;
  531.       case THING_RESPAWN_FRAME:
  532.           mobjinfo[thing].raisestate = atoi(arg);
  533.           break;
  534.       case FRAME_SPRITE_NUMBER:
  535.           states[frame].sprite = atoi(arg);
  536.           break;
  537.       case FRAME_SPRITE_SUBNUMBER:
  538.           states[frame].frame = atoi(arg);
  539.           break;
  540.       case FRAME_DURATION:
  541.           states[frame].tics = atoi(arg);
  542.           break;
  543.       case FRAME_NEXT_FRAME:
  544.           states[frame].nextstate = atoi(arg);
  545.           break;
  546.       case FRAME_UNKNOWN_1:
  547.           states[frame].misc1 = atoi(arg);
  548.           break;
  549.       case FRAME_UNKNOWN_2:
  550.           states[frame].misc2 = atoi(arg);
  551.           break;
  552.       case WEAPON_AMMO_TYPE:
  553.           weaponinfo[weapon].ammo = atoi(arg);
  554.           break;
  555.       case WEAPON_DESELECT_FRAME:
  556.           weaponinfo[weapon].upstate = atoi(arg);
  557.           break;
  558.       case WEAPON_SELECT_FRAME:
  559.           weaponinfo[weapon].downstate = atoi(arg);
  560.           break;
  561.       case WEAPON_BOBBING_FRAME:
  562.           weaponinfo[weapon].readystate = atoi(arg);
  563.           break;
  564.       case WEAPON_SHOOTING_FRAME:
  565.           weaponinfo[weapon].atkstate = atoi(arg);
  566.           break;
  567.       case WEAPON_FIRING_FRAME:
  568.           weaponinfo[weapon].flashstate = atoi(arg);
  569.           break;
  570.       case AMMO_MAX_AMMO:
  571.           maxammo[ammo] = atoi(arg);
  572.           break;
  573.       case AMMO_PER_AMMO:
  574.           clipammo[ammo] = atoi(arg);
  575.           break;
  576.       case CHEAT_CHANGE_MUSIC:
  577.           DE_Cheat(cheat_mus_seq,arg);
  578.           break;
  579.       case CHEAT_CHAINSAW:
  580.           DE_Cheat(cheat_choppers_seq,arg);
  581.           break;
  582.       case CHEAT_GOD_MODE:
  583.           DE_Cheat(cheat_god_seq,arg);
  584.           break;
  585.       case CHEAT_AMMO_KEYS:
  586.           DE_Cheat(cheat_ammonokey_seq,arg);
  587.           break;
  588.       case CHEAT_AMMO:
  589.           DE_Cheat(cheat_ammo_seq,arg);
  590.           break;
  591.       case CHEAT_NO_CLIPPING_1:
  592.           DE_Cheat(cheat_noclip_seq,arg);
  593.           break;
  594.       case CHEAT_NO_CLIPPING_2:
  595.           DE_Cheat(cheat_commercial_noclip_seq,arg);
  596.           break;
  597.       case CHEAT_INVINCIBILITY:
  598.           DE_Cheat(cheat_powerup_seq[0],arg);
  599.           break;
  600.       case CHEAT_BERSERK:
  601.           DE_Cheat(cheat_powerup_seq[1],arg);
  602.           break;
  603.       case CHEAT_INVISIBILITY:
  604.           DE_Cheat(cheat_powerup_seq[2],arg);
  605.           break;
  606.       case CHEAT_RADIATION_SUIT:
  607.           DE_Cheat(cheat_powerup_seq[3],arg);
  608.           break;
  609.       case CHEAT_AUTO_MAP:
  610.           DE_Cheat(cheat_powerup_seq[4],arg);
  611.           break;
  612.       case CHEAT_LITE_AMP_GOGGLES:
  613.           DE_Cheat(cheat_powerup_seq[5],arg);
  614.           break;
  615.       case CHEAT_BEHOLD_MENU:
  616.           DE_Cheat(cheat_powerup_seq[6],arg);
  617.           break;
  618.       case CHEAT_LEVEL_WARP:
  619.           DE_Cheat(cheat_clev_seq,arg);
  620.           break;
  621.       case CHEAT_PLAYER_POSITION:
  622.           DE_Cheat(cheat_mypos_seq,arg);
  623.           break;
  624.       case CHEAT_MAP_CHEAT:
  625.           DE_Cheat(cheat_amap_seq,arg);
  626.           break;
  627.       case MISC_INITIAL_HEALTH:
  628.           initial_health = atoi(arg);
  629.           break;
  630.       case MISC_INITIAL_BULLETS:
  631.           initial_bullets = atoi(arg);
  632.           break;
  633.       case MISC_MAX_HEALTH:
  634.           MAXHEALTH = atoi(arg);
  635.           break;
  636.       case MISC_MAX_ARMOR:
  637.           max_armor = atoi(arg);
  638.           break;
  639.       case MISC_GREEN_ARMOR_CLASS:
  640.           green_armor_class = atoi(arg);
  641.           break;
  642.       case MISC_BLUE_ARMOR_CLASS:
  643.           blue_armor_class = atoi(arg);
  644.           break;
  645.       case MISC_MAX_SOULSPHERE:
  646.           maxsoul = atoi(arg);
  647.           break;
  648.       case MISC_SOULSPHERE_HEALTH:
  649.           soul_health = atoi(arg);
  650.           break;
  651.       case MISC_MEGASPHERE_HEALTH:
  652.           mega_health = atoi(arg);
  653.           break;
  654.       case MISC_GOD_MODE_HEALTH:
  655.           god_health = atoi(arg);
  656.           break;
  657.       case MISC_IDFA_ARMOR:
  658.           idfa_armor = atoi(arg);
  659.           break;
  660.       case MISC_IDFA_ARMOR_CLASS:
  661.           idfa_armor_class = atoi(arg);
  662.           break;
  663.       case MISC_IDKFA_ARMOR:
  664.           idkfa_armor = atoi(arg);
  665.           break;
  666.       case MISC_IDKFA_ARMOR_CLASS:
  667.           idfa_armor_class = atoi(arg);
  668.           break;
  669.       case MISC_BFG_CELLS_SHOT:
  670.           BFGCELLS = atoi(arg);
  671.           break;
  672.       case SPRITE_OFFSET:
  673.           sprnames[sprite]=oldsprnames[(atoi(arg)-151328)/8];
  674.  
  675.       case POINTER_CODEP_FRAME:
  676.           states[frame].action = actions[atoi(arg)];
  677.  
  678.       default:
  679.         return(0);
  680.     }
  681.  
  682.     return(1);
  683. }
  684.  
  685.  
  686. void
  687. DE_AddDeh(char * name)
  688. {
  689.   FILE *fp;
  690.   char text[255];
  691.  
  692.   printf("DE_AddDeh: Adding %s\n", name);
  693.  
  694.   if((fp = fopen(name,"r")))
  695.   {
  696.     int i;
  697.  
  698.     /* Backup all action pointer */
  699.     for(i=0;i<NUMSTATES;i++)
  700.         actions[i] = states[i].action;
  701.  
  702.     /* Backup all sprite name pointer */
  703.     for(i=0;i<NUMSPRITES;i++)
  704.         oldsprnames[i] = sprnames[i];
  705.  
  706.     /* Start parsing the file */
  707.     while(fgets(text, 255, fp))
  708.     {
  709.         int len1 = 0, len2 = 0;
  710.         text[strlen(text)-1] = '\0';
  711.  
  712.         if(text[0] == '#') continue;
  713.         if(text[0] == '\n') continue;
  714.  
  715.         /* Check for text or hack */
  716.         if(sscanf(text, "Text %d %d", &len1, &len2) == 2)
  717.           DE_Text(fp, len1, len2);
  718.         else
  719.           DE_Hack(text);
  720.     }
  721.  
  722.     fclose(fp);
  723.   }
  724.   else
  725.   {
  726.     printf("Dehacked file '%s' not found\nPress ENTER to continue\n", name);
  727.     getchar();
  728.   }
  729. }
  730.